﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.View;
using SIIE_ERP.Codigo;
using System.Threading;

namespace Elysium.Demo.Inventarios.Catalogos
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class Articulos_Alta : UserControl, IPropiedadesNavegacion
    {
        ////////////////////////////////////////////////////////////////////////////
        //  PROPIEDADES DE NAVEGACION
        public string Texto { get { return _texto; } }
        public TabControl TabControlPadre { get { return _tabControlPadre; } }
        public TabItem TabItemPadre { get { return _tabItemPadre; } }

        private string _texto;
        private TabControl _tabControlPadre;
        private TabItem _tabItemPadre;

        public void setParametros(string Texto, ref TabControl tabControl, ref TabItem tabItem)
        {
            this._texto = Texto; this._tabControlPadre = tabControl; this._tabItemPadre = tabItem;
        }

        private void ButtonRegresar_Click(object sender, RoutedEventArgs e)
        {
            _tabControlPadre.Items.Remove(_tabItemPadre);
        }
        // FIN DE PROPIEDADES DE NAVEGACION
        ///////////////////////////////////////////////////////////////////////////

        private UsuarioActivo _sesion;
        
        public Articulos_Alta(UsuarioActivo usuario)
        {
            InitializeComponent();
            this._sesion = usuario;
            CargaCatalogos();
        }

        private void CargaCatalogos()
        {
            ComboBoxUI.ComboLinea(ComboLinea, _sesion);
            ComboBoxUI.ComboGrupoProductos(ComboGrupo, _sesion);
            ComboBoxUI.ComboMonedas(ComboMoneda, _sesion);
            ComboBoxUI.ComboUnidadMedida(ComboUnidadMedida, _sesion);
            ComboBoxUI.ComboTasasImpuestos(ComboTasaImpuestos, _sesion);
            ComboBoxUI.ComboTipoArticulo(ComboTipoProducto);
            ComboBoxUI.ComboCostoPreferido(ref ComboCostoPreferido);
        }

        private void CampoClave_TextChanged(object sender, TextChangedEventArgs e)
        {
            GeneraClave(CampoClave.Text);
        }

        private void GeneraClave(string ClaveArticulo)
        {
            var ClaveLinea = new SIIE_ERP.BaseDatos.Inventarios.Catalogos.dbo_Cat_Linea(_sesion.RFC, _sesion.UserName)
                                         .Get_Linea_Por_Id(Int32.Parse(ComboLinea.SelectedValue.ToString())).Rows[0]["Clave"].ToString();

            var ClaveColor = new SIIE_ERP.BaseDatos.Inventarios.Catalogos.dbo_Cat_Color(_sesion.RFC, _sesion.UserName)
                                         .Get_Color_Por_Id(Int32.Parse(ComboColor.SelectedValue.ToString())).Rows[0]["Clave"].ToString();

            var ClaveTalla = new SIIE_ERP.BaseDatos.Inventarios.Catalogos.dbo_Cat_Talla(_sesion.RFC, _sesion.UserName)
                                         .Get_Talla_Por_Id(Int32.Parse(ComboTalla.SelectedValue.ToString())).Rows[0]["Clave"].ToString();


            LabelIdentificador.Content = ClaveArticulo + "-" + ClaveLinea + "-" + ClaveColor + "-" + ClaveTalla;
        }

        private void Button_Guardar_Click(object sender, RoutedEventArgs e)
        {
            if (!Validaciones()) return;

            var Clave = CampoClave.Text;
            var Nombre = CampoNombre.Text;
            var NombreCorto = CampoNombreCorto.Text;
            var DescripcionExtendida = CampoDescripcionExtendida.Text;
            var TipoProducto = Int32.Parse(ComboTipoProducto.SelectedValue.ToString());
            var CodigoBarras = CampoCodigoBarras.Text;
            var Marca = CampoMarca.Text;
            var Grupo = Int32.Parse(ComboGrupo.SelectedValue.ToString());
            var Subgrupo = Int32.Parse(ComboSubgrupo.SelectedValue.ToString());
            var LineaProducto = Int32.Parse(ComboLinea.SelectedValue.ToString());
            var Color = Int32.Parse(ComboColor.SelectedValue.ToString());
            var Talla = Int32.Parse(ComboTalla.SelectedValue.ToString());
            var UnidadMedida = Int32.Parse(ComboUnidadMedida.SelectedValue.ToString());
            var DisponibleVenta = (bool)CheckDisponible.IsChecked;
            var Descontinuado = (bool)CheckDescontinuado.IsChecked;
            var Moneda = Int32.Parse(ComboMoneda.SelectedValue.ToString());
            var TasaImpuesto = Int32.Parse(ComboTasaImpuestos.SelectedValue.ToString());
            var PrecioListaConImpuesto = Double.Parse(CampoPrecioListaConImpuesto.Text);
            var PrecioListaSinImpuesto = CampoPrecioListaSinImpuestos.Text;
            var PrecioMinimoConImpuesto = Double.Parse(CampoPrecioMinimoConImpuestos.Text);
            var PrecioMinimoSinImpuesto = CampoPrecioMinimoSinImpuestos.Text;
            var CostoPreferido = Int32.Parse(ComboCostoPreferido.SelectedValue.ToString());

            var CostoEstandar = Double.Parse(CampoCostoEstandar.Text);
            var CostoUltimo = Double.Parse(CampoUltimoCostoCompra.Text);
            var CostoPromedio = Double.Parse(CampoCostoPromedio.Text);

            var db = new SIIE_ERP.BaseDatos.Inventarios.Catalogos.dbo_Cat_Articulo(_sesion.RFC, _sesion.UserName);

            if (db.Insert_Articulo(Clave,
                                   Nombre,
                                   NombreCorto,
                                   DescripcionExtendida,
                                   CodigoBarras,
                                   Marca,
                                   TipoProducto,
                                   Grupo,
                                   Subgrupo,
                                   LineaProducto,
                                   Color,
                                   Talla,
                                   UnidadMedida,
                                   DisponibleVenta,
                                   Descontinuado,
                                   Moneda,
                                   PrecioListaConImpuesto,
                                   PrecioMinimoConImpuesto,
                                   TasaImpuesto,
                                   CostoPreferido,
                                   CostoEstandar,
                                   CostoUltimo,
                                   CostoPromedio,
                                   0).Id == 1)
            {
                MessageBox.Show("Artículo agregado correctamente.");
                _tabControlPadre.Items.Remove(_tabItemPadre);    
            }
            else
            {
                MessageBox.Show("Error al agregar el artículo.");
            }
        }

        private void ComboGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Actualiza el ComboBox de Subgrupo cuando escogen un grupo
            if(ComboGrupo.SelectedValue != null)
            {
                
                var str = ComboGrupo.SelectedValue.ToString();
                ComboBoxUI.ComboSubGrupoProductos(ref ComboSubgrupo, _sesion, Int32.Parse(str));
            }
        }

        private void ComboLinea_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (ComboLinea.SelectedValue != null)
            {
                var str = ComboLinea.SelectedValue.ToString();
                ComboBoxUI.ComboColor(ref ComboColor, _sesion, Int32.Parse(str));
                ComboBoxUI.ComboTalla(ref ComboTalla, _sesion, Int32.Parse(str));
            }
        }

        private bool Validaciones()
        {
            if (String.IsNullOrEmpty(CampoClave.Text))
            {
                MessageBox.Show("El campo Clave no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoNombre.Text))
            {
                MessageBox.Show("El campo Nombre no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoNombreCorto.Text))
            {
                MessageBox.Show("El campo Nombre Corto no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoCodigoBarras.Text))
            {
                MessageBox.Show("El campo Codigo de Barras no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoPrecioListaConImpuesto.Text))
            {
                MessageBox.Show("El campo Precio de Lista (Con Impuestos) no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoPrecioMinimoConImpuestos.Text))
            {
                MessageBox.Show("El campo Precio Minimo (Con Impuestos) no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoCostoEstandar.Text))
            {
                MessageBox.Show("El campo Costo Estandar no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoCostoPromedio.Text))
            {
                MessageBox.Show("El campo Costo Promedio no puede ser vacio."); return false;
            }
            if (String.IsNullOrEmpty(CampoUltimoCostoCompra.Text))
            {
                MessageBox.Show("El campo Ultimo Costo de Compra no puede ser vacio."); return false;
            }
            //Valida que se hayan escogido combos:
            if (ComboTipoProducto.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un tipo de producto."); return false;
            }
            if (ComboGrupo.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un grupo de producto."); return false;
            }
            if (ComboSubgrupo.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un subgrupo de producto."); return false;
            }
            if (ComboLinea.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una linea de producto."); return false;
            }
            if (ComboColor.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un color de producto."); return false;
            }
            if (ComboTalla.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una talla de producto."); return false;
            }
            if (ComboMoneda.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una moneda."); return false;
            }
            if (ComboTasaImpuestos.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una tasa de impuestos."); return false;
            }
            try { Double.Parse(CampoPrecioListaConImpuesto.Text); }
            catch (Exception)
            {
                MessageBox.Show("El campo Precio de Lista con Impuesto debe ser númerico."); return false;
            }

            try { Double.Parse(CampoPrecioMinimoConImpuestos.Text); }
            catch (Exception)
            {
                MessageBox.Show("El campo Precio Minimo con Impuesto debe ser númerico."); return false;
            }
            if (ComboCostoPreferido.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar un costo preferido."); return false;
            }
            try { Double.Parse(CampoCostoEstandar.Text); }
            catch (Exception)
            {
                MessageBox.Show("El campo Costo Estandar debe ser númerico."); return false;
            }
            try { Double.Parse(CampoCostoPromedio.Text); }
            catch (Exception)
            {
                MessageBox.Show("El campo Costo Promedio debe ser númerico."); return false;
            }
            try { Double.Parse(CampoUltimoCostoCompra.Text); }
            catch (Exception)
            {
                MessageBox.Show("El campo Ultimo Costo de Compra debe ser númerico."); return false;
            }
            return true;
        }

        private void CalculaTasaImpuestos(string value)
        {
            CampoPrecioListaSinImpuestos.Text = SIIE_ERP.Codigo.Inventarios.Impuestos.CalculaImpuestos(CampoPrecioListaConImpuesto.Text,
                                                                                                       value,
                                                                                                       _sesion);
            CampoPrecioMinimoSinImpuestos.Text = SIIE_ERP.Codigo.Inventarios.Impuestos.CalculaImpuestos(CampoPrecioMinimoConImpuestos.Text,
                                                                                                       value,
                                                                                                       _sesion);
        }

        private void ComboTasaImpuestos_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CalculaTasaImpuestos((e.AddedItems[0] as CItem).Id);
        }

        private void CampoPrecioListaConImpuestos_TextChanged(object sender, KeyboardFocusChangedEventArgs e)
        {
            CalculaTasaImpuestos(ComboTasaImpuestos.SelectedValue.ToString());
        }

        private void CampoPrecioMinimoConImpuestos_TextChanged(object sender, KeyboardFocusChangedEventArgs e)
        {
            CalculaTasaImpuestos(ComboTasaImpuestos.SelectedValue.ToString());
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Articulos.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void CampoNombre_LostKeyboardFocus_1(object sender, KeyboardFocusChangedEventArgs e)
        {
            CampoNombreCorto.Text = CampoNombre.Text.ToString().Substring(0, 12);
            CampoNombreCorto.Focus();
        }
    }
}
